export default class StyleSizeOperation {
  /**
   * 对带有单位的 CSS 大小值进行求和，例如 1px, 2px, 3px 返回 6px
   * @param sizes - 大小值数组
   * @returns 求和后的大小值
   */
  public static summation(...sizes: string[]): string {
    if (sizes.length === 0) {
      throw new Error('At least one size string should be provided.')
    }

    const totalValue = sizes.reduce((accumulator, currentSize) => {
      const value = parseFloat(currentSize)
      if (isNaN(value)) {
        throw new Error('Invalid input. All arguments should be valid size strings.')
      }
      return accumulator + value
    }, 0)

    const unit = this.getUnit(sizes[0])
    return totalValue.toString() + (unit || '')
  }

  /**
   * 根据倍数计算带有单位的大小值，例如将 20px 运算为 20rpx，0.2 返回 4rpx
   * @param size - 原始大小值
   * @param multiplier - 倍数
   * @returns 计算后的大小值
   */
  public static calculateScaledSize(size: string, multiplier: number): string {
    const value = parseFloat(size) // 解析大小值
    const unit = size.match(/[a-zA-Z]+/)?.[0] || '' // 提取单位

    // 根据倍数计算新的大小值
    const scaledValue = value * multiplier

    // 组合新的大小值和单位
    const scaledSize = scaledValue.toString() + unit
    return scaledSize
  }

  /**
   * 获取大小值的单位
   * @param value - 大小值
   * @returns 单位
   */
  private static getUnit(value: string): string | null {
    const unitMatch = value.match(/[a-zA-Z%]+/)
    return unitMatch ? unitMatch[0] : null
  }
}
